define(function(require, exports){
	var $		= require("jquery");
	var pubjs	= require('pubjs');
	var view	= require('@base/view');
	var util	= require('util');

	var CHARGEDATA = [
		{text:LANG('预充值'),value:'1', right: 'recharge.charge'},
		{text:LANG('返款'),value:'3', right: 'recharge.rebate'},
		{text:LANG('扣费'),value:'5', right: 'recharge.deduct'},
		{text:LANG('充保证金'),value:'2', right: 'sunfei.deposit'}
	];

	var USER_TYPE = pubjs.config("CONST/USER_TYPE");
	var top;
	var Charge = view.widget.extend({
		init: function( config ) {
			var type = pubjs.getUserCurrent('Type');

			config = pubjs.conf( config, {
				"dspuserInfoUrl": 'user/info',
				"userRechargeUrl": 'user/recharge',
				"userCheckExceedUrl": 'user/checkExceed',
				'costInfoUrl': 'cost/getCurrencyType',
				"layout": {
					"module": '@base/dialog.base',
					"mask": 1,
					"title": LANG('账户充值'),
					"showFoot": true, // 显示底层的取消和完成按钮
					"width": 500,
					"close": null,
					"silence": false // 点击按钮发消息
				},
				"vModel": {
					'isAdmin': (type === USER_TYPE.ADMIN),
					'dspUserName': '',
					// 是否显示实时返款选项，我们的账号才可以看到实时返款
					"isShowRealTime": true,
					// 是否显示消耗货币的类型
					'isConsume': false,
					// 是否显示消耗货币的数值
					'isConsumeValue': false,
					// 是否显示消耗货币的余额
					'isRemainValue': false,
					// 余额
					'cost': 0,
					// 需要花费的金额
					'needCost': 0,
					'view':{
						//余额样式
						'isCheckCost' : 0,
						//充值金额符号
						'chargeSign':'',
						//消耗金额符号
						'consumeSign':'',
						// 大写数字
						'standar': ''
					},

					// 保存字段
					'isOpenRealTime': 0, // 是否开启实时返款
					'realTimeValue': 0, // 实时返款金额
					'memo': '' // 备注
				}
			});
			this.Super( 'init', arguments );
			//缓存id
			this.$id = 0;
			this.$charge={};
			top = this;
		},
		afterBuild:function(){
			var self = this;
			var el = self.getDOM();

			$([
				'<div class="P-dspUserCharge pl20">',
					'<div class="mb20">',
					'<label class="M-formLabel mr10">' + LANG('公司名称：') + '</label>',
					'<span class="valign-m">{{dspUserName}} </span>',
					'</div>',
				'<div class="mb20">',
					'<label class="M-formLabel mr10">' + LANG('充值类型：') + '</label>',
					'<span pub-name="chargeType" pub-mod="@base/common/input.radioGroup"/>',
				'</div>',
				'<div class="mb20" >',
					'<label class="M-formLabel mr10">' + LANG('充值货币：') + '</label>',
					'<span pub-name="chargeCurrencyType" pub-mod="@base/common/drop.drop"/>',
				'</div>',
				'<div class="mb20">',
					'<label class="M-formLabel mr10">' + LANG('充值金额：') + '</label>',
					'<span class="valign-m mr5" v-show="view.chargeSign">{{view.chargeSign}}</span>',
					'<span class="mr10 M-formInput" pub-name="dspUserChargeAmount" pub-mod="@base/common/input.text"/>',
				'<p class="standar font-primary" v-bind:class="{\'font-danger\': view.standar==\'输入非法！\'}">{{view.standar}}</p>',
				'</div>',
				'<div v-show="isConsume">',
					'<div class="mb20">',
						'<label class="M-formLabel mr10">' + LANG('消耗货币：') + '</label>',
						'<span pub-name="consumeCurrencyType" pub-mod="@base/common/drop.drop"/>',
						'<span class="M-formSectionTips" pub-name="consumeTip" pub-mod="@base/tip.desc"/>',
					'</div>',
					'<div >',
						'<div class="mb20" v-show="isConsumeValue">',
							'<label class="M-formLabel mr10">' + LANG('消耗金额：') + '</label>',
							'<span class="mr5 valign-m">{{view.consumeSign}}</span>',
							'<span class="valign-m">{{needCost}}</span>',
						'</div>',
						'<div class="mb20" v-show="isRemainValue">',
							'<label class="M-formLabel mr10">' + LANG('当前余额：') + '</label>',
							'<span> {{view.consumeSign}}</span>',
							'<span >{{cost}}</span>',
							'<span class="ml20" style="color:green" v-show="view.isCheckCost == 1">' + LANG('余额充足') + '</span>',
							'<span class="ml20" style="color:red" v-show="view.isCheckCost == 2">' + LANG('余额不足') + '</span>',
						'</div>',
					'</div>',
				'</div>',
				'<div v-show="isAdmin && isShowRealTime">',
					'<div class="mb20">',
						'<label class="M-formzLabel mr10">' + LANG('是否开启实时返款：') + '</label>',
						'<label class="mr20">',
							'<input type="radio" v-model="isOpenRealTime" number value="0"/>' + LANG('否'),
						'</label>',
						'<label class="mr20">',
							'<input type="radio" v-model="isOpenRealTime" number value="1"/>' + LANG('是'),
						'</label>',
					'</div>',
					'<div class="mb20" v-show="isOpenRealTime == 1">',
						'<label class="M-formzLabel mr10">' + LANG('实时返款金额：') + '</label>',
						'<input type="text" v-model="realTimeValue"/>',
					'</div>',
					'</div>',
					'<div class="mb20">',
						'<label class="M-formLabel remark mr10">' + LANG('备注：') + '</label>',
						'<textarea rows="4" v-model="memo" class="remarkText"></textarea>',
					'</div>',
				'</div>'
			].join('')).appendTo(el);

			self.vm.mount();

			var chargeList = self.$chargeList = [];
			util.each(CHARGEDATA, function(item)
			{
				if (item.right && pubjs.checkRight(item.right))
				{
					chargeList.push(item);
				}
			});

			self.buildFromTemplate({
				'chargeType': {
					'data': chargeList
				},
				'dspUserChargeAmount': {
					'width': 300,
					'events': 'keyup'
				},
				'chargeCurrencyType': {
					'url':'category/currency',
					'hasSearch': false,
					'def': LANG('选择类型'),
					'width': 300,
					'value': 0,
					'param':{'type':'all'}, //返回id==change的数据
				},
				'consumeCurrencyType': {
					'url':'category/getCurrencyRate',
					'hasSearch': false,
					'def': LANG('选择类型'),
					'width': 350,
					'value': 0,
					'options': [],
					'param':{id:1}, //返回change==选择参数的数据
					'result_render': self.result_render,
				},
				'consumeTip': {
					width:300,
					data:LANG('汇率转换会有少量浮动，如非实际需要，请勿随意充值转换。')
				}
			});
		},
		load: function( id ) {
			var self = this;
			self.$id = id;
			self.showLoading();
			pubjs.mc.send( self.getConfig('dspuserInfoUrl'), {
				'_id': +id
			}, self.onData.bind(self));
		},
		onData: function( err, data ) {
			this.hideLoading();
			if( err ){
				pubjs.alert( err.message );
				return false;
			}
			this.setData(data);
		},
		setData: function( data ){
			var self = this;
			//设置充值选项
			self.$.chargeType.setValue(1);
			self.setChargeType(data);
			//填写充值公司名字，并且默认选择第一个充值选项
			self.vm.$.dspUserName = data.Name;
			// todo 编辑时，隐藏是否开启实时返款和实时返款输入框

			return self;
		},
		getData: function( data ){
			var self = this;
			var cs = self.$;
			var vm = self.vm.$;
			var type = +self.$.chargeType.getValue();
			var IsOpenRealTime = 0;
			var RealTimeValue = 0;
			if(type == 1){
				IsOpenRealTime = +vm.isOpenRealTime;
				RealTimeValue = +vm.isOpenRealTime == 1 ? +vm.realTimeValue : 0;
			}

			return {
				'_id': self.$id,
				'Type': +cs.chargeType.getValue(),
				'Memo': util.trim(vm.memo),
				'Amount': +cs.dspUserChargeAmount.getValue(),
				'IsOpenRealTime': IsOpenRealTime,
				'RealTimeValue': RealTimeValue,
				'OriginCurrency': +cs.consumeCurrencyType.getValue(true).id,
				'TargetCurrency': +cs.chargeCurrencyType.getValue(true).id,
			}
		},
		//设置充值类型
		setChargeType: function( data ){
			var self = this;
			var type = data.Type;
			var IsCredit = data.Finance.Credit.IsCredit;
			var labels = self.$.chargeType.find('label');


			var currentId = pubjs.getUserId();
			var createUserId = data.CreateUserId;

			// 如果跨级操作账号
			if ((currentId != createUserId))
			{
				labels.find('input[data-id]').parent().css('display', 'none');
				// 只有舜飞账号同时有保证金充值权限的员工
				if (currentId == 34750 && pubjs.checkRight('sunfei.crossDeposit'))
				{
					// 客户有设置保证金，可操作该客户的保证金
					if (IsCredit)
					{
						labels.find('input[data-id="2"]').parent().css('display', 'inline-block');
						this.$.chargeType.setValue(2);
					}
					// 客户没有设置保证金，没有该客户的保证金操作。
					else
					{
						pubjs.alert('舜飞账号仅允许跨级操作客户的保证金，但是该客户没有开启保证金选项，无法操作该客户');
						this.reset().hide();
						return false;
					}
				}
				// 其他的账号一律无法操作。
				else
				{
					pubjs.alert('无权操作改用户');
					this.reset().hide();
					return false;
				}
			}
			else
			{
				labels.find('input[data-id]').parent().css('display', 'inline-block');
				// 仅可充保证金客户有该选项
				labels.find('input[data-id="2"]').parent().css('display', IsCredit ? 'inline-block' : 'none');
				// 代理才有分成选项
				labels.find('input[data-id="4"]').parent().css('display', type == 1 ? 'inline-block' : 'none');
				// 直客没有收益充值
				//labels.eq(5).css('display',type == 2 ? 'none' : 'inline-block');
			}
		},
		reset: function(){
			this.vm.reset();
			this.$.chargeType.setValue(1);

			this.$.dspUserChargeAmount.setValue('');

			this.$.chargeCurrencyType.reset();
			this.$.consumeCurrencyType.reset();
			return this;
		},
		//确认上传充值金额
		//后台接口没写，只是将数据在前端打印
		//同时还要增加权限，表单数据的过滤和提示功能
		save: function(id){
			var data = this.getData();
			var self = this;

			if (!this.$chargeList || !this.$chargeList.length)
			{
				pubjs.alert(LANG('无充值权限'));
				return false;
			}

			if(this.validate(data)){
				var c = this.getConfig();
				if([1].indexOf(data.Type) > -1)
				{
					pubjs.loading.show();
					pubjs.mc.send(c.userCheckExceedUrl, {UserId: +data._id}, function (err, param) {
						pubjs.loading.hide();
						if(err)
						{
							return pubjs.alert(err.message);
						}

						if(param.Exceed)
						{
							pubjs.confirm(LANG('该账号因余额不足活动已进入超预算状态，是否确定充值并开启活动?'), function (state) {
								if(state)
								{
									self.charge(data);
								}
							});
						}
						else
						{
							self.charge(data);
						}
					});
				}
				else
				{
					self.charge(data);
				}
			}
		},
		charge: function (data) {
			var self = this;
			// 充值中请勿重复操作
			if (self.$charge_status)
			{
				return false;
			}

			self.$charge_status = true;
			pubjs.confirm(LANG(' 确认提交?'), function(isOk){
				if (isOk) {
					pubjs.loading.show();
					pubjs.mc.send(self.getConfig('userRechargeUrl'), data, self.onSave.bind(self));
				}else{
					self.$charge_status = false;
				}
			});
		},
		onSave: function(err, data){
			this.$charge_status = false;
			pubjs.loading.hide();
			if(err){
				pubjs.alert(err.message);
				return false;
			}
			pubjs.alert(LANG('充值成功'));
			this.fire('chargeSuccess');
			this.reset();
			this.hide();
		},
		//响应点击完成事件
		onDialogOk: function(ev){
			this.save(this.$id);
		},
		validate: function(data){
			if(!data.Type){
				pubjs.alert(LANG('请选择充值选项'));
				return false;
			}
			if (!data.TargetCurrency){
				pubjs.alert(LANG('请选择充值货币类型'));
				return false;
			}
			if (!data.OriginCurrency){
				pubjs.alert(LANG('请选择消费货币类型'));
				return false;
			}
			if(!util.isNumber(data.Amount)){
				pubjs.alert(LANG('输入金额非法'));
				return false;
			}
			if(!data.Amount){
				pubjs.alert(LANG('充值金额不能为0'));
				return false;
			}

			if (data.Amount < 0)
			{
				pubjs.alert(LANG('充值请输入正数'));
				return false;
			}

			if (data.Memo === '') {
				pubjs.alert(LANG('请输入备注'));
				return false;
			}

			// 如果打开了实时返款金额，才对里面填写的金额做判断
			if (data.IsOpenRealTime) {
				if (!util.isNumber(data.RealTimeValue)) {
					pubjs.alert(LANG('输入金额非法'));
					return false;
				}
				if (!data.RealTimeValue) {
					pubjs.alert(LANG('实时返金额不能为0'));
					return false;
				}
				if (data.Amount < 0) {
					pubjs.alert(LANG('充值请输入正数'));
					return false;
				}
			}

			return true;
		},
		onInputKeyup: function(ev){
			this.showStandar();
			this.showNeedCost(ev);
			return false;
		},
		onRadioChange: function(ev){
			var name = ev.name;
			var param = ev.param;
			if(name == 'chargeType'){
				this.vm.set('isShowRealTime', ev.param == 1);
			}
		},
		//联动显示大写
		showStandar: function() {
			var inputVal = this.$.dspUserChargeAmount.getValue();
			var result = pubjs.standarNumberWithoutUnit(inputVal);
			this.vm.set('view.standar', result);
			return this;
		},
		//联动消费金额
		showNeedCost: function () {
			//充值的金额
			var Amount = +this.$.dspUserChargeAmount.getValue();
			var isConsumeValue = this.vm.$.isConsumeValue;
			if(Amount && isConsumeValue){
				//获取充值货币
				var chargeId = this.$.chargeCurrencyType.getValue().id;
				//获取消耗货币
				var consumeObject = this.$.consumeCurrencyType.getValue();
				if(chargeId&&consumeObject){
					//找到对象中的汇率
					this.vm.$.needCost = util.toFixed(Amount*(+consumeObject.rate), 2);
					//判断是否超过当前余额
					this.checkCost(this.vm.$.needCost);
				}
			}else{
				this.vm.$.needCost = 0;
			}
		},
		setCost: function (err , data) {
			if(data){
				this.vm.$.cost = data.Remain;
			}
			this.showNeedCost();
		},
		// 选择变化时间
		onDropChange: function (ev) {
			var vm = this.vm.$;
			var name = ev.name;
			var param = ev.param;
			var id = +param.id || 0;
			var self = this;
			//选择货币后显示下一个步骤
			switch (name){
				case 'chargeCurrencyType':
					if(!id){
						vm.isConsume = false;
					}else{
						vm.isConsume = true;
						//消耗的货币需要联动加载,重新请求后台
						this.$.consumeCurrencyType.setParam({id:id}).load();
						this.$.consumeCurrencyType.setValue(id);
						this.$.dspUserChargeAmount.setValue('');
						this.vm.$.needCost = 0;
						this.$charge = {
							id:ev.param.id,
							name:ev.param.name
						}
						//如果存在货币符号，显示符号
						if(param.option.sign){
							this.vm.$.view.chargeSign = param.option.sign;
						}
					}

					break;
				case 'consumeCurrencyType':
					if(!id){
						vm.isConsumeValue = false;
					}else{
						vm.isConsumeValue = true;
						vm.isRemainValue = false;
						// 这里以后请用user 来判断是否是admin用户，如是，不需要关心余额情况
						if(!pubjs.checkRight("super right admin /*todo*/")) {
							vm.isRemainValue = true;
							// 选择消耗的货币后，需要联动加载相应的余额
							pubjs.mc.send( this.getConfig('costInfoUrl'), {
								'currencyId': +id
							}, self.setCost.bind(this));
						}
					}
					//如果存在货币符号，显示符号
					if(param.option.sign){
						this.vm.$.view.consumeSign = param.option.sign;
					}
					//切换消耗货币时同时修改消耗货币
					this.showNeedCost();
					break;
			}

			self.showStandar();
		},
		// 选择后渲染效果
		result_render: function (ev,param,result) {
			//选择充值货币名称  this没有执行全局
			if(+param.id && top.$charge.name && param.option.rate){
				var temp = LANG(param.name + " ( 系统汇率：" + top.$charge.name +" : "+ param.name +" = 1 : " + param.option.rate + "  )");
				return temp;
			}else if(param.option.rate){
				var temp = LANG(param.name + " ( 系统汇率：" + param.option.rate +")");
				return temp;
			}
			//如果有消耗货币的符号

			return param.name;
		},
		// 检查是否超过余额，后端也要判断 , 还没有考虑js小数点
		checkCost: function (needcost) {
			var cost = this.vm.$.cost;
			if(+needcost){
				if((+needcost) <= cost){
					this.vm.$.view.isCheckCost = 1; //充足
				}else{
					this.vm.$.view.isCheckCost = 2; //不足
				}
			}else{
				this.vm.$.view.isCheckCost =0;
			}
		}
	});
	exports.base = Charge;
});